#include <iostream>
#include <string>
#include "Controler.hpp"
#include "ErrorCodes.hpp"

typedef std::string String ;

extern int yyparse(Controler *);
extern FILE * yyin;

using namespace std;

int main(int argc, char *argv[]) {

	Controler controler = Controler();

	if (argc == 2){

		yyin = fopen(argv[1], "r");

		int resParse = 0;

		try {

			resParse = yyparse(&controler);

		} catch (ErrorCode errorCode) {
			switch (errorCode) {
				case INCOMPATIBLE_TYPES_BETWEEN_EXPRESSIONS:
					controler.errorMsg("Expressions avec types incompatibles");
					break;
				case INTERNAL_ERRROR:
					controler.errorMsg("Erreur interne : lors d'un calcul d'expression sur une opération");
					break;
				case TYPE_INCOMPATIBLE_WITH_OPERATOR:
					controler.errorMsg("Type incompatible avec l'opérateur");
					break;
			}
			resParse = 1;
		}


		if(resParse != 1){

			fclose(yyin);

			controler.getIdentTable()->show();

			std::cout << std::endl;
			std::cout << std::endl;

			controler.getSymbolTablesManager()->show();

			std::cout << std::endl;
			std::cout << std::endl;

			controler.showOutputCode();
		}

	}


	return 0;
}

